package sv.com.bolsaTrabajo.view.bean;

import javax.faces.application.Application;
import javax.faces.application.FacesMessage;
import javax.faces.application.FacesMessage.Severity;
import javax.faces.component.UIComponent;
import javax.faces.context.ExternalContext;
import javax.faces.context.FacesContext;
import javax.faces.el.ValueBinding;

import org.primefaces.context.RequestContext;

/**
 * @author Karina Palacios
 *
 */
public class ManejadorAccion {

    private static void showFacesMsg(Exception e, String msg, String cabecera,
            String componetID, Severity severityError) {

        RequestContext requestContext = RequestContext.getCurrentInstance();
        FacesContext context = FacesContext.getCurrentInstance();

        if (e != null) {

            loadConsoleError(e, getCauseMsgs(e.getCause()));
        }

        context.addMessage(null, new FacesMessage(severityError, cabecera, msg));

        if (requestContext != null) {
            requestContext.update(componetID);
        }
    }

   
    /**
     * Generar el mensaje de error para la consola y responder al ibs
     *
     */
    public static void loadConsoleError(Exception excepcion, String msgError) {
    }

    public static String generateDataTexto(String dato, Integer size) {
        if (dato == null) {
            dato = " ";
        }
        if (dato.length() < size) {
            dato = formatoCadena(dato, "%1$-" + size + "s");
        }
        if (dato.length() == size) {
            return dato;
        }
        return dato;
    }

    private static String formatoCadena(String dato, String format) {
        // format "%1$-10s"
        String out = String.format(format, dato);
        return out;
    }

    private static String getCauseMsgs(Throwable cause) {
        String causeMsgs = "";
        if (cause == null) {
            return "";
        } else {
            if (cause.getCause() == null) {
                causeMsgs = cause.getMessage();
            } else {
                causeMsgs = causeMsgs + getRootCauseErrMsg(cause.getCause());
            }
            return causeMsgs;
        }
    }

    private static String getRootCauseErrMsg(Throwable cause) {
        String errMsg = null;
        if (cause == null) {
            return "";
        } else {
            if (cause.getCause() == null) {
                errMsg = cause.getMessage();
            } else {
                errMsg = getRootCauseErrMsg(cause.getCause());
            }
            return errMsg;
        }
    }


    /**
     * *
     * Despliega mensajes en el FacesContext asociados a un componente
     *
     * @param idComponente (Opcional) message que se desea agregar el mensaje
     * (Null se enviaran al contexto general de messages)
     * @param cabecera de mensaje
     * @param detalle de mensaje
     * @param severidad Severidad del mensaje
	 *
     */
    private void lanzarMensaje(Exception e, String idComponente, String cabecera, String detalle, Severity severidad) {
        showFacesMsg(e, detalle, cabecera, idComponente, severidad);
    }

    /**
     * Despliega mensajes de Informaci�n al FacesContext en el contenedor
     * message
     *
     * @param id del componente que se cargara el mensaje (Null se enviaran al
     * contexto general de messages)
     * @param cabecera de mensaje
     * @param detalle de mensaje
	 *
     */
    protected void lanzarMensajeInformacion(String idComponente,
            String cabecera, String detalle) {
        lanzarMensaje(null, "IDGrowlMensaje", cabecera, detalle,
                FacesMessage.SEVERITY_INFO);
    }

    /**
     * Despliega mensajes de Informaci�n al FacesContext en el contenedor
     * message
     *
     * @param id del componente que se cargara el mensaje (Null se enviaran al
     * contexto general de messages)
     * @param cabecera de mensaje
     * @param detalle de mensaje
	 *
     */
    protected void lanzarMensajeInformacion(String cabecera, String detalle) {
        lanzarMensaje(null, "IDGrowlMensaje", cabecera, detalle,
                FacesMessage.SEVERITY_INFO);
    }

    /**
     * Despliega mensajes de Advertencia al FacesContext en el contenedor
     * message
     *
     * @param id del componente que se cargara el mensaje (Null se enviaran al
     * contexto general de messages)
     * @param cabecera de mensaje
     * @param detalle de mensaje
	 *
     */
    protected void lanzarMensajeAdvertencia(String idComponente,
            String cabecera, String detalle) {
        lanzarMensaje(null, "IDGrowlMensaje", cabecera, detalle,
                FacesMessage.SEVERITY_WARN);
    }

    /**
     * Despliega mensajes de Advertencia al FacesContext en el contenedor
     * message
     *
     * @param id del componente que se cargara el mensaje (Null se enviaran al
     * contexto general de messages)
     * @param cabecera de mensaje
     * @param detalle de mensaje
	 *
     */
    protected void lanzarMensajeAdvertencia(String cabecera, String detalle) {
        lanzarMensaje(null, "IDGrowlMensaje", cabecera, detalle,
                FacesMessage.SEVERITY_WARN);
    }

    /**
     * Despliega mensajes de Error al FacesContext en el contenedor message
     *
     * @param id del componente que se cargara el mensaje (Null se enviaran al
     * contexto general de messages)
     * @param cabecera de mensaje
     * @param detalle de mensaje
	 *
     */
    protected void lanzarMensajeError(String idComponente, String cabecera,
            String detalle) {
        lanzarMensaje(null, "IDGrowlErrorSistemas", cabecera, detalle,
                FacesMessage.SEVERITY_ERROR);
    }

    /**
     * Despliega mensajes de Error al FacesContext en el contenedor message
     *
     * @param cabecera de mensaje
     * @param detalle de mensaje
     * @param excepcion que desencadena el mensaje de error
	 *
     */
    protected void lanzarMensajeError(String cabecera, String detalle, Exception excepcion) {
        lanzarMensaje(excepcion, "IDGrowlErrorSistemas", cabecera, detalle, FacesMessage.SEVERITY_ERROR);
    }

    /**
     * Despliega mensajes de Fatal al FacesContext en el contenedor message
     *
     * @param id del componente que se cargara el mensaje (Null se enviaran al
     * contexto general de messages)
     * @param cabecera de mensaje
     * @param detalle de mensaje
	 *
     */
    protected void lanzarMensajeFatal(String cabecera, String detalle) {
        lanzarMensaje(null, "IDGrowlErrorSistemas", cabecera, detalle,
                FacesMessage.SEVERITY_FATAL);
    }

    /**
     * Despliega mensajes de Fatal al FacesContext en el contenedor message
     *
     * @param id del componente que se cargara el mensaje (Null se enviaran al
     * contexto general de messages)
     * @param cabecera de mensaje
     * @param detalle de mensaje
     * @param excepcion que desencadena el mensaje de error
	 *
     */
    protected void lanzarMensajeFatal(String cabecera, String detalle,
            Exception excepcion) {
        lanzarMensaje(null, "IDGrowlErrorSistemas", cabecera, detalle, FacesMessage.SEVERITY_FATAL);
    }

    /**
     * Despliega mensajes de Fatal al FacesContext en el contenedor message
     *
     * @param id del componente que se cargara el mensaje (Null se enviaran al
     * contexto general de messages)
     * @param cabecera de mensaje
     * @param detalle de mensaje
     * @param excepcion que desencadena el mensaje de error
	 *
     */
    protected void lanzarMensajeFatal(Exception excepcion) {
        lanzarMensaje(null, "IDGrowlErrorSistemas",
                excepcion.getCause().toString(), excepcion.getMessage(),
                FacesMessage.SEVERITY_FATAL);
    }

    /**
     * Retorna el nombre de la pagina en la que se este
     * usando el ManagedBean
     * @return String (nombre de pagina)
     *
     *
     */
    @SuppressWarnings({"static-access", "unused"})
    public String getContexto() {
        FacesContext fc = FacesContext.getCurrentInstance();
        ExternalContext ec = fc.getExternalContext();

        String contexto = fc.getCurrentInstance().getExternalContext().getRequestContextPath();
        String id = fc.getViewRoot().getViewId();

        System.out.println("Contexto " + contexto + "  ID: " + id);
        String[] arreglo = id.split("/");

        return arreglo[arreglo.length - 1];
    }

    public static Object getBean(String expr) {
		FacesContext context = FacesContext.getCurrentInstance();
		Application app = context.getApplication();
		ValueBinding binding = app.createValueBinding("#{" + expr + "}");
		Object value = binding.getValue(context);
		return value;
	}
    public static void restaurarValoresFormulario(String id) {
		 UIComponent content = FacesContext.getCurrentInstance().getViewRoot().findComponent(id);
		 content.getChildren().clear();
	 }
}
